package ar.com.sectorwine.services;

import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import ar.com.sectorwine.entities.Empresa;
import ar.com.sectorwine.entities.Stock;
import ar.com.sectorwine.repository.EmpresaRepository;
import ar.com.sectorwine.repository.EmpresasDAO;
import ar.com.sectorwine.repository.StockRepository;

@Service
@Transactional(propagation = Propagation.MANDATORY)
public class StockServiceImpl implements StockService {

	@Autowired
	StockRepository stockRepository;
	@Autowired
	EmpresaRepository empresaRepository;

	@Autowired
	EmpresasDAO empresasDAO;
	@Autowired
	ParametrosService parametrosService;

	private static final Logger logger = LoggerFactory
			.getLogger(StockServiceImpl.class);

	@Override
	public void crearStock(Long idEmpresa, Stock stock) {
		stock.setFechaCreacionStock(new Date());
		Empresa empresa = empresasDAO.findOne(idEmpresa);
		empresa.addStock(stock);

		empresasDAO.update(empresa);
		logger.info("STOCK CREADO");
	}

	@Override
	public List<Stock> getStocks() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Stock getStock(String id) {
		Long idStock = Long.parseLong(id);
		Stock stock = stockRepository.findOne(idStock);
		logger.info("STOCK ENCONTRADO");
		return stock;
	}

	@Override
	public void modificarStock(Stock stock) {

		if (stockRepository.findOne(stock.getId()) != null) {
			stockRepository.save(stock);
			logger.info("STOCK MODIFICADO");
		} else {
			logger.info("STOCK NO MODIFICADO - NO EXISTE STOCK.");
		}

	}

	@Override
	public boolean bajaStock(String id) {
		try {
			Long idStock = Long.parseLong(id);
			Stock stockMod = stockRepository.findOne(idStock);
			stockMod.setBaja(true);
			stockRepository.save(stockMod);
			logger.info("STOCK DADO DE BAJA");
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	@Override
	public Object getParametro(String parametroBuscado) {

		return parametrosService.getValue(parametroBuscado);

	}

	@Override
	public List<Stock> buscarStockEmpresa(Long id) {
		Empresa empresa = empresasDAO.findOne(id);
		List<Stock> lista = empresa.getProductos();
		return lista;
	}

	@Override
	public List<Stock> listarStockAlta(Long idEmpresa) {
		return stockRepository.listarStockDeAlta(idEmpresa);
	}

	@Override
	public List<Stock> buscarVinoPorAtributos(Double azucar, Double acidez,
			Double color, Double alcohol, String variedad) {
		List<Stock> lista = stockRepository.busquedaPorAtributosDeVino(azucar,
				acidez, color, alcohol, variedad);
		return lista;
	}

	@Override
	public void marcarVendido(String id) {
		try {
			Long idStock = Long.parseLong(id);
			Stock stockMod = stockRepository.findOne(idStock);
			Date fechaVenta = stockMod.getFechaVenta();
			if (fechaVenta == null) {
				stockMod.setFechaVenta(new Date());
				// informar q se marco como vendido correctamente
				logger.info("STOCK VENDIDO");
			} else {
				// informar que no se puede por algun motivo
			}

		} catch (Exception e) {
			logger.error("Error en el metodo marcarVendido");
		}

	}

	@Override
	public Empresa obtenerEmpresaByStock(Long idStock) {
		return empresaRepository.obtenerEmpresaPorStock(idStock);
	}
}
